package com.qfmy.config;

import com.qfmy.common.pojo.TestUser;
import com.qfmy.common.pojo.TokenVo;
import com.qfmy.common.utils.CommonUtils;
import com.qfmy.common.utils.JwtUtils;
import com.qfmy.common.utils.StringUtils;
import com.qfmy.core.base.service.TokenService;
import com.qfmy.core.constant.CommonConstants;
import com.qfmy.core.pojo.entity.ErrorCode;
import com.qfmy.core.pojo.exception.CustomException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import javax.servlet.http.HttpServletRequest;

/**
 * @ClassName: LoginArgumentResolvers
 * @author： zhengjt
 * @data： 2022/6/7 16:08
 * @version：1.0
 * @描述： 自定义参数解析器
 *      登录参数解析，将token转换成对象，存入方法参数中
 *      用于WebConfig配置类中addArgumentResolvers方法的传入
 */
@Component
@Slf4j
public class LoginArgumentResolvers implements HandlerMethodArgumentResolver {

    @Autowired
    private TokenService tokenService;

    private String tokenType = CommonUtils.getConfigValue("TOKEN.TYPE");

    /**
     * 用于controller中参数判断是否有符合条件的判断参数
     *      if（true）{
     *          进入 resolveArgument方法中
     *      }else {
     *          跳过，不做任何处理
     *      }
     * @param methodParameter
     * @return  true / false
     */
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        //  获取传入参数的类型
        Class<?> clazz = methodParameter.getParameterType();
        //  clazz == 需要转换的对象
        return clazz == TokenVo.class;
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        String token = request.getHeader(CommonConstants.AUTH_TOKEN);
        //  判断token是否存在
        if (StringUtils.isNull(token)){
//            throw new CustomException(ErrorCode.TOKEN_NEVER);
            return null;
        }
        //  解析token，获取对应的对象
///        TokenVo object = JwtUtils.getTokenUser(token, tokenType);
        TokenVo object = tokenService.getTokenVo(token);
        /// 测试使用代码
//        TestUser object = new TestUser();
//        object.setId("123456");
//        object.setUsername("TestUser");
        return object;
    }
}
